/**
 * @Project : algorithm-learning
 * @Author : Ruoyu Wang
 * @User : Momenta
 * @DateTime : 2024/3/24 15:54
 */


//多多快递站共有n个快递点，n个快递点之间通过m条单向车道连接。
//快递员从任何一个快递站点出发，都无法通过单向车道回到该站点。也就是说，n个快递点组成一张有向无环图。
//对于快递点u，如果对于所有的快递点v(v!=u)，快递员都可以从u走到v，或者从v走到u，那么则评定站点u为超级快递点。
//请你帮忙算一算，一共有多少个超级快递点。
//
//输入描述
//  第一行2个数字n(2≤n≤3*10^5),m(1≤m≤3*10^5),n为快递点个数，m为单向车道个数。
//  接下来的m行每行两个数字u,v（1≤u,v≤n,u!=v），表示有一条站点u指向v的单向车道。
//输出描述
//  请输出1个数字，表示超级快递点的个数。
//
//示例1
//输入
//7 7
//1 2
//2 3
//3 4
//4 7
//2 5
//5 4
//6 4
//输出
//2
//说明
//  快递点4可以到达4，7，可以从1，2，3，5，6到达，评为超级快递点
//  快递点7可以到达7，可以从1，2，3，4，5，6到达，评为超级快递点

#include <iostream>
#include <vector>

using namespace std;

const int N = 3 * 1e5 + 10;
vector<int> g[N];
int to[N];
int go[N];
bool st[N];
//bool super[N];
int n, m;

void dfs(int k, int c) {
    go[k]++;
    to[c] += c;
    for (int v: g[k]) {
        if (!st[v]) {
            st[v] = true;
            dfs(v, c + 1);
        }
        go[k] += go[v];
    }
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        int u, v;
        scanf("%d%d", &u, &v);
        g[u].push_back(v);
    }

    for (int i = 1; i <= n; ++i) {
        if (!st[i]) {
            st[i] = true;
            dfs(i, 0);
        }
    }

    for (int i = 1; i < n; ++i) {
        cout << go[i] << " ";
    }
    cout << endl;
    for (int i = 1; i < n; ++i) {
        cout << to[i] << " ";
    }

    int res = 0;
    for (int i = 1; i <= n; ++i) {
        if (go[i] + to[i] == n) res++;
    }

    printf("%d", res);

    return 0;
}